package stack

import (
	"errors"
	"fmt"
)
// 顺序栈，通过数组实现
type Stack struct {
	size int // 容量
	top  int // 栈顶
	data []interface{}
}

func NewStack(size int) *Stack {
	s := &Stack{}
	s.size = size
	s.data = make([]interface{}, size)
	return s
}

func (s *Stack) IsEmpty() bool {
	return s.top == 0
}

func (s *Stack) IsFull() bool {
	return s.top == s.size
}

func (s *Stack) Length() int {
	return s.top
}

func (s *Stack) Push(data interface{}) bool {
	if s.IsFull() {
		return false
	}
	s.data[s.top] = data
	s.top++
	return true
}

func (s *Stack) Pop() (interface{}, error) {
	if s.IsEmpty() {
		return nil, errors.New("empty stack")
	}
	data := s.data[s.top]
	s.top--
	return data, nil
}

// 遍历（不删除任何节点，只读取值）
func (s *Stack) Print() {
	if s.IsEmpty() {
		fmt.Println("Empty Stack")
	} else {
		for i := s.top-1; i >= 0; i-- {
			fmt.Println(fmt.Sprintf("%d ->", s.data[i]))
		}
	}
	fmt.Println()
}
